package com.gzy.rpsm_property.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class TokenUtil {
    // 密钥，应该在实际应用中妥善保管
    private static final String SECRET_KEY = "rpsm-secret-key";
    public static String generateToken(Integer userId) {
        String token = Jwts.builder()
                .setIssuer("RPSM")
                .setSubject(userId.toString())// 将用户ID设置到JWT的subject中，方便后续查询用 户信息
                .setIssuedAt(new Date(System.currentTimeMillis()))// 设置Token签发创建时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 4))
// 4小时后过期
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)// 使用HS256算法和SECRET_KEY 进行签名
                .compact();
        return token;
    }
    // 校验JWT Token是否合法以及是否过期，如果合法且未过期，则返回解析出的userId
    public static Integer validateTokenAndGetUserId(String token) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)// 使用之前设置的密钥验证Token
                    .parseClaimsJws(token)
                    .getBody();
            Date expiration = claims.getExpiration();
            if (expiration.after(new Date())) {// 检查Token是否过期
                return Integer.valueOf(claims.getSubject());// 解析出subject中的用户ID并返回
            } else {
// Token已过期
                System.out.println("Token已过期");
                return null;
            }
        } catch (Exception e) {
// 如果解析失败，则Token不合法或已损坏
            System.out.println("Token不合法或已损坏");
            return null;
        }
    }
}
